package net.cassite.daf4j.ds;

import net.cassite.daf4j.IData;
import net.cassite.daf4j.PreResult;

/**
 * IData解释器
 */
public interface EntityDataParser<Context, BasicElement> {
        /**
         * 解释IData
         *
         * @param context 上下文
         * @param data    要解释的idata
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement parseData(Context context, IData<?> data) throws Exception;

        /**
         * 解释实体
         *
         * @param context 上下文
         * @param entity  要解释的实体
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement parseEntity(Context context, Object entity) throws Exception;

        /**
         * 解释常量(类型为java.开头或者javax.开头)
         *
         * @param context 上下文
         * @param o       要解释的常量
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement parsePlain(Context context, Object o) throws Exception;

        /**
         * 解释子查询
         *
         * @param context      上下文
         * @param subQuery     子查询
         * @param parserPacket 解析包
         * @param <DS>         数据源类型
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        <DS> BasicElement parseQuery(Context context,
                                     PreResult<?> subQuery,
                                     ParserPacket<Context, BasicElement, DS> parserPacket) throws Exception;
}
